package com.M10.BE.database;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class InveDatabaseHelper extends SQLiteOpenHelper {

    //private static final String DBAdapter_TAG = "InveDatabaseHelper=>";

    public InveDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub

        /**
         * 当打开时，它允许一个写线程与多个读线程同时在一个SQLiteDatabase上起作用。实现原理是写操作其实是在一个单独的文件，不是原数据库文件。
         * 所以写在执行时，不会影响读操作，读操作读的是原数据文件，是写操作开始之前的内容。
         * 在写操作执行成功后，会把修改合并会原数据库文件。此时读操作才能读到修改后的内容。但是这样将花费更多的内存。
         * 有了它，多线程读写问题就解决了，可惜只能在API 11 以上使用。
         */
        //        if (Build.VERSION.SDK_INT >= 11)
        //        {
        //            getWritableDatabase().enableWriteAheadLogging();
        //        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        //创建相应的表
        db.execSQL(Constants.CREATE_TABLE_INVETORY);
        db.execSQL(Constants.CREATE_TABLE_ASSET);
        String version = getSqLiteVersion(db);
        Log.e(Constants.DBAdapter_TAG, "create ok");
        if (version.compareTo(Constants.SQLITE_VERSION) < 0) {
            //版本低于3.6.19
            Log.d(Constants.DBAdapter_TAG, "sqlite version:smaller than 3.6.19");
        } else {
            if (!db.isReadOnly()) {
                // Enable foreign key constraints
                Log.i(Constants.DBAdapter_TAG, "sqlite version:  bigger than 3.6.19");
                //打开数据库外键约束
                db.execSQL(Constants.OPEN_FOREIGN_KEY);
            }
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        Log.i(Constants.DBAdapter_TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        //更好的删除原来所有表的方法 
        List<String> tables = new ArrayList<String>();
        Cursor cursor = db.rawQuery("SELECT * FROM sqlite_master WHERE type='table';", null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            String tableName = cursor.getString(1);
            if (!tableName.equals("android_metadata") && !tableName.equals("sqlite_sequence"))
                tables.add(tableName);
            cursor.moveToNext();
        }
        cursor.close();

        for (String tableName : tables) {
            db.execSQL("DROP TABLE IF EXISTS " + tableName);
        }

        //重新建表操作
        onCreate(db);
    }

    public String getSqLiteVersion(SQLiteDatabase db) {
        String version = null;
        Cursor cursor = db.rawQuery("select sqlite_version() as sqlite_version", null);
        while (cursor.moveToNext()) {
            version = cursor.getString(0);
        }
        return version;
    }

    @Override
    public void close() {
        super.close();
    }

    //    public SQLiteDatabase openOrCreateDatabase(File file)
    //    {
    //        return SQLiteDatabase.openOrCreateDatabase(file, null);
    //    }
}
